package com.bootdo.api.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * 注解工具类
 * 
 * @author hrh
 * @date 2016年5月27日 下午4:55:23
 */
public class AnnotationUtils {

	/**
	 * 获取类中 get方法和对应的 Validate注解
	 * 
	 * @param t
	 * @return LinkedHashMap<Method, Validate>
	 * @throws Exception
	 */
	public static <T> LinkedHashMap<Method, Validate> getMethodAndAnnotations(T t) {
		LinkedHashMap<Method, Validate> linkedHashMap = new LinkedHashMap<Method, Validate>();
		Method[] methods = t.getClass().getMethods();
		Field[] fields = t.getClass().getDeclaredFields();
		for (Method method : methods) {
			String methodName = method.getName();// 获得方法名
			for (Field field : fields) {
				String fileName = field.getName();
				String str = "get" + fileName.substring(0, 1).toUpperCase() + fileName.substring(1);
				if (str.equals(methodName)) {
					Validate validate = method.getAnnotation(Validate.class);
					if (validate != null) {
						linkedHashMap.put(method, validate);
					}
				}
			}
		}
		return linkedHashMap;
	}

	/**
	 * 获取类中 get方法对应的属性
	 * 
	 * @param <T>
	 * @param t
	 * @return LinkedHashMap<Method, Validate>
	 * @throws Exception
	 */
	public static <T> List<Field> getFields(T t) {
		List<Field> list = new ArrayList<Field>();
		Method[] methods = t.getClass().getMethods();
		Field[] fields = t.getClass().getDeclaredFields();
		for (Method method : methods) {
			String methodName = method.getName();// 获得方法名
			for (Field field : fields) {
				String fileName = field.getName();
				String str = "get" + fileName.substring(0, 1).toUpperCase() + fileName.substring(1);
				if (str.equals(methodName)) {
					Validate validate = method.getAnnotation(Validate.class);
					if (validate != null) {
						list.add(field);
					}
				}
			}
		}
		return list;
	}
}
